package com.bjpowernode.boss.utils;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.bjpowernode.boss.constants.KeyConst;
import com.bjpowernode.boss.mvc.model.dto.PmsMenuDto;
import jakarta.annotation.Resource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.Supplier;

/**
 * redis 工具类
 */
@Component
public class RedisUtil {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    // 存入方法
    public void setValue(String key, String val) {
        stringRedisTemplate.opsForValue().set(key, val);
    }

    // 存入方法 , 带定时时间
    public void setValue(String key, String val, long timeout, TimeUnit unit) {
        stringRedisTemplate.opsForValue().set(key, val, timeout, unit);
    }

    // 获取方法
    public String getValue(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }


    /**
     * 获取数据缓存
     * lambda表达式 , 函数式入口
     *
     * @param redisSupplier    :  redis 生产者
     * @param databaseSupplier : 数据库 生产者
     * @param databaseConsumer : 消费者
     * @return
     */
    public <T> List<T> getData(Supplier<List<T>> redisSupplier, Supplier<List<T>> databaseSupplier, Consumer<List<T>> databaseConsumer) {
        // 从redis 中获取数据
        List<T> list = redisSupplier.get();

        // 判空
        if (CollectionUtils.isEmpty(list)) {
            // 是空的
            // 数据库生产者 提供数据
            list = databaseSupplier.get();
            // 将数据 添加到 redis中
            if (!CollectionUtils.isEmpty(list)) {
                databaseConsumer.accept(list);
            }
        }
        return list;
    }

    public boolean delKey(String key) {
        return Boolean.TRUE.equals(stringRedisTemplate.delete(key));
    }

    public Boolean setHashValue(String key, Map<String, String> value) {
        stringRedisTemplate.opsForHash().putAll(key, value);
        return exists(key);
    }

    public Boolean exists(String key) {
        return stringRedisTemplate.hasKey(key);
    }

    public String getHashValue(String key , String field) {
        return (String) stringRedisTemplate.opsForHash().get(key, field);
    }

}
